package br.com.cast.syscast.persistencia;

import java.util.Iterator;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Component;

import br.com.cast.syscast.models.Municipio;

@Component 
public class MunicipioDAO extends DAOBase {
	
	public MunicipioDAO() {
	}
	
	public List<Municipio> consultaTodos() {
		
		Query query = getEntityManager()
				.createQuery("FROM Municipio");
		
		return query.getResultList();
	}
	
	public Iterator<Municipio> consultaPaginada(long inicio, long total) {
		
		StringBuilder hql = new StringBuilder();
		
		hql.append(" SELECT m ")
			.append(" FROM Municipio m ")
			.append("	JOIN m.uf u ")
			.append("	JOIN u.pais p ");
		
		Query query = getEntityManager()
				.createQuery(hql.toString());
		
		query.setFirstResult((int) inicio);
		query.setMaxResults((int) total);
		
		return query.getResultList().iterator();
	}
	
	public long total() {
		StringBuilder hql = new StringBuilder();
		
		hql.append("SELECT COUNT(*) as total ")
		   .append("FROM Municipio");
		
		Query query = getEntityManager()
				.createQuery(hql.toString());

		return (long) query.getSingleResult();
	}
	
	public void salvar(Municipio municipio) {
		getEntityManager().persist(municipio);
	}
	
	public void alterar(Municipio municipio) {
		getEntityManager().merge(municipio);
	}
	
	public void excluir(Municipio municipio) {
		municipio = (Municipio) 
				getHibernateCurrentSession().get(
				Municipio.class, municipio.getId());
		
		getEntityManager().remove(municipio);
	}

	public boolean municipioJaCadastrado(Municipio municipio) {

		StringBuilder hql = new StringBuilder();
		
		hql.append("SELECT COUNT(*) as qtd ")
		   .append("FROM Municipio m ")
		   .append(" JOIN m.uf u ")
		   .append("WHERE m.nome = :nome ")
		   .append(" AND u.id = :idUf ");
		
		if (municipio.getId() != null) {//alteração
			hql.append(" AND m.id <> :id ");
		}

		Query query = getEntityManager()
				.createQuery(hql.toString());
			
		query.setParameter("nome", 
				municipio.getNome());
		query.setParameter("idUf", 
				municipio.getUf().getId());
		
		if (municipio.getId() != null) {//alteração
			query.setParameter("id", municipio.getId());
		}
		
		return (long)query.getSingleResult() > 0;
	}
	
}
